import subprocess

# Pod 命名约定


class KubernetesCLI:
    def __init__(self, kubeconfig_path=None):
        """
        初始化 Kubernetes 命令封装类
        :param kubeconfig_path: kubeconfig 文件路径（可选，默认使用 ~/.kube/config）
        """
        self.kubeconfig_option = f"--kubeconfig={kubeconfig_path}" if kubeconfig_path else ""

    # ---------------------- Pods 操作 ----------------------
    def list_pods(self, namespace='default'):
        """
        列出指定命名空间下的所有 Pods
        :param namespace: 命名空间
        :return: Pod 列表（每一行包含 Pod 名称和状态）
        """
        command = f"kubectl {self.kubeconfig_option} get pods -n {namespace} -o custom-columns=NAME:.metadata.name,STATUS:.status.phase"
        result = self.run_command(command)
        return result.splitlines()[1:]  # 忽略表头

    def get_pod_containers(self, pod_name, namespace='default'):
        """
        获取指定 Pod 的容器列表
        :param pod_name: Pod 名称
        :param namespace: 命名空间
        :return: 容器名称列表
        """
        command = f"kubectl {self.kubeconfig_option} get pod {pod_name} -n {namespace} -o jsonpath='{{.spec.containers[*].name}}'"
        result = self.run_command(command)
        return result.split()

    # ---------------------- 容器内操作 ----------------------
    def exec_command_in_container(self, pod_name, container_name, command, namespace='default'):
        """
        在容器内执行命令
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param command: 要执行的命令（字符串形式）
        :param namespace: 命名空间
        :return: 命令输出
        """
        full_command = f"kubectl {self.kubeconfig_option} exec -n {namespace} {pod_name} -c {container_name} -- {command}"
        return self.run_command(full_command)

    def get_container_working_dir(self, pod_name, container_name, namespace='default'):
        """
        查看容器内的当前工作目录
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param namespace: 命名空间
        :return: 当前工作目录路径
        """
        return self.exec_command_in_container(pod_name, container_name, "pwd", namespace)

    def list_directory_in_container(self, pod_name, container_name, path, namespace='default'):
        """
        列出容器内指定目录的文件
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param path: 容器内的目录路径
        :param namespace: 命名空间
        :return: 目录下文件列表
        """
        return self.exec_command_in_container(pod_name, container_name, f"ls -l {path}", namespace)

    def move_file_in_container(self, pod_name, container_name, source, destination, namespace='default'):
        """
        移动容器内的文件
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param source: 源文件路径
        :param destination: 目标文件路径
        :param namespace: 命名空间
        :return: 操作结果
        """
        return self.exec_command_in_container(pod_name, container_name, f"mv {source} {destination}", namespace)

    def delete_file_in_container(self, pod_name, container_name, path, namespace='default'):
        """
        删除容器内的文件
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param path: 文件路径
        :param namespace: 命名空间
        :return: 操作结果
        """
        return self.exec_command_in_container(pod_name, container_name, f"rm -f {path}", namespace)

    def create_and_write_file_in_container(self, pod_name, container_name, file_path, content, namespace='default'):
        """
        在容器内创建文件并写入内容
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param file_path: 文件路径
        :param content: 要写入的内容
        :param namespace: 命名空间
        :return: 操作结果
        """
        command = f"echo '{content}' > {file_path}"
        return self.exec_command_in_container(pod_name, container_name, command, namespace)

    def read_file_in_container(self, pod_name, container_name, file_path, namespace='default'):
        """
        从容器内读取文件内容
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param file_path: 文件路径
        :param namespace: 命名空间
        :return: 文件内容
        """
        command = f"cat {file_path}"
        return self.exec_command_in_container(pod_name, container_name, command, namespace)

    # ---------------------- 容器和宿主机间 文件复制 ----------------------
    def copy_file_to_container(self, pod_name, container_name, source_path, container_path, namespace='default'):
        """
        从宿主机复制文件到容器
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param source_path: 宿主机文件路径
        :param container_path: 容器内目标路径
        :param namespace: 命名空间
        """
        command = f"kubectl {self.kubeconfig_option} cp {source_path} {namespace}/{pod_name}:{container_path} -c {container_name}"
        self.run_command(command)
        print(f"Copied {source_path} to {pod_name}:{container_path}")

    def copy_file_from_container(self, pod_name, container_name, container_path, destination_path, namespace='default'):
        """
        从容器复制文件到宿主机
        :param pod_name: Pod 名称
        :param container_name: 容器名称
        :param container_path: 容器内文件路径
        :param destination_path: 宿主机目标路径
        :param namespace: 命名空间
        """
        command = f"kubectl {self.kubeconfig_option} cp {namespace}/{pod_name}:{container_path} {destination_path} -c {container_name}"
        self.run_command(command)
        print(f"Copied {pod_name}:{container_path} to {destination_path}")

    # ---------------------- 工具方法 ----------------------
    def run_command(self, command):
        """
        运行命令行并捕获输出
        :param command: 要运行的命令
        :return: 命令输出
        """
        try:
            result = subprocess.run(command, shell=True, capture_output=True, text=True, check=True)
            return result.stdout.strip()
        except subprocess.CalledProcessError as e:
            print(f"Error running command: {command}\n{e.stderr.strip()}")
            return None



if __name__ == "__main__":
    # 初始化 KubernetesCLI 对象
    kube_cli = KubernetesCLI()

    namespace = "default"  # 命名空间
    pod_name = "your-pod-name"  # 替换为目标 Pod 名称
    container_name = "your-container-name"  # 替换为目标容器名称

    # 列出所有 Pods
    print("Listing Pods:")
    pods = kube_cli.list_pods(namespace)
    print("\n".join(pods))

    # 获取容器列表
    print("\nContainers in Pod:")
    containers = kube_cli.get_pod_containers(pod_name, namespace)
    print("\n".join(containers))

    # 获取容器内工作目录
    print("\nWorking Directory in Container:")
    working_dir = kube_cli.get_container_working_dir(pod_name, container_name, namespace)
    print(working_dir)

    # 列出容器内文件
    print("\nFiles in /tmp:")
    files = kube_cli.list_directory_in_container(pod_name, container_name, "/tmp", namespace)
    print(files)

    # 创建并写入文件
    print("\nCreating and writing to file in container:")
    write_result = kube_cli.create_and_write_file_in_container(
        pod_name, container_name, "/tmp/test-file.txt", "Hello, Kubernetes!", namespace
    )
    print(write_result)

    # 读取文件内容
    print("\nReading file content in container:")
    file_content = kube_cli.read_file_in_container(pod_name, container_name, "/tmp/test-file.txt", namespace)
    print(file_content)

    # 删除文件
    print("\nDeleting file in container:")
    delete_result = kube_cli.delete_file_in_container(pod_name, container_name, "/tmp/test-file.txt", namespace)
    print(delete_result)
